function    A314()
format long;

% 经验模式分解：EMD将信号自适应分解成从高到低不同频率的IMF，不改变原数据的物理特性。
% 计算叠加了钢筋干扰的衬砌信号的固有模态函数

% 设置随机数种子，以确保每次运行结果一致
rng(0);

% 读取Excel文件
data = readtable('A314_data_void.xlsx');   %第一套数据
%yRebar = data{:, 1};      % 读取第1列（仅有钢筋的衬砌信号）
yVoid = data{:, 3};      % 读取第3列（仅有空洞的衬砌信号）
yRebar = data{:, 2};       % 读取第2列（钢筋+空洞的衬砌信号）

% 读取Excel文件
%data_single = readtable('A3_data_single.xlsx');   %第二套数据
%data_double = readtable('A3_data_double.xlsx');
%yRebar = data_single{:, 150};    % 读取第150列（单排钢筋衬砌信号）
%yVoid = data_double{:, 150};     % 读取第150列（双排钢筋衬砌信号）

% 数据长度
N = length(yRebar);  % 获取数据点个数
% 总时间1秒
T = 1;  % 总时间1秒
% 计算采样频率 fs
fs = N / T;  % 采样频率 = 数据点数 / 总时间
% 生成时间向量 t
t = (0:N-1) / fs;  % 根据数据点数和采样频率生成时间向量

% 绘制叠加了空洞缺陷的异常衬砌信号，并选择从0.3 s开始的0.6 s间隔绘制信号。
xLimLeft = 0;  % 时间区间起点
xLimRight = 1;  % 时间区间终点
% 在信号中添加白高斯噪声。指定噪声方差为 1/150^2
rn = 150;
yGood = yVoid + randn(size(yVoid))/rn;
yBad = yRebar + randn(size(yVoid))/rn;
subplot(1, 1, 1)
plot(t, yGood, 'b-', t, yBad, 'r--')
xlim([xLimLeft xLimRight])
legend('Void', 'Rebar+Void')

% 使用emd对仅有空洞的正常衬砌信号执行经验模式分解。计算前五个内部模式函数（IMF）。
[imfGood, residualGood] = emd(yGood, 'MaxNumIMF', 5, 'Display', 1);

% 使用emd对叠加了钢筋和空洞的衬砌信号执行经验模式分解。计算前五个内部模式函数（IMF）。
[imfBad, residualBad] = emd(yBad, 'MaxNumIMF', 5, 'Display', 1);

% 显示IMF对比：分别显示IMF1、IMF2、IMF3、IMF4、IMF5
figure;
numIMF = size(imfGood, 2);  % 获取IMF的数量，假设`yGood`和`yBad`有相同的IMF数量
for i = 1:numIMF
    subplot(numIMF + 1, 1, i);  % 为每个IMF创建一个子图
    plot(t, imfGood(:, i), 'b-', 'DisplayName', ['IMF ' num2str(i) ' (Void)']);
    hold on
    plot(t, imfBad(:, i), 'r--', 'DisplayName', ['IMF ' num2str(i) ' (Rebar)']);
    legend show
    title(['Comparison of IMF ' num2str(i)]);
    hold off
end

% 显示残差对比
subplot(numIMF + 1, 1, numIMF + 1);  % 最后一个子图显示残差
plot(t, residualGood, 'b-', 'DisplayName', 'Residual (Void)');
hold on
plot(t, residualBad, 'r--', 'DisplayName', 'Residual (Rebar)');
legend show
title('Comparison of Residuals');
hold off

% 使用不带输出参数的emd来可视化前三种模式和残差。
%emd(yGood, 'MaxNumIMF', 5);

% 使用不带输出参数的emd来可视化前三种模式和残差。
%emd(yBad, 'MaxNumIMF', 5)